﻿#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//数组名是首元素的地址

//int main()
//{
//	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
//	printf("arr    =%p\n", arr);
//	printf("&arr[0]=%p\n", &arr[0]);
//	return 0;
//}

//有两个例外
//sizeof(数组名)，sizeof中单独放数组名，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩，单位是字节
//& 数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址（整个数组的地址和数组⾸元素的地址是有区别的）
//除此之外，任何地⽅使⽤数组名，数组名都表⽰⾸元素的地址。

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0]   =  %p\n", &arr[0]);
//	printf("&arr[0]+1 =  %p\n", &arr[0] + 1);
//	printf("arr       =  %p\n", arr);
//	printf("arr+1     =  %p\n", arr + 1);
//	printf("&arr      =  %p\n", &arr);
//	printf("&arr+1    =  %p\n", &arr + 1);
//	return 0;
//}

//使用指针访问数组

//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p + i);//arr+i   &arr[0]+i   &arr[i]
//	}
//
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", i[arr]);//i[arr]  arr[i]
//	}
//	return 0;
//}

//i[arr]可行不推荐

//数组名就是地址
//[]下标引用操作符 arr[i] = i[arr] = *(arr + i) = *(i + arr)


//void Print(int arr[])
//{
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//}
//
//int main()
//{
//	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
//	Print(arr);
//	return 0;
//}
//分析
//Print(arr)中的arr不是两种例外，是首元素地址
//所以给函数传的参数arr只是首元素地址
//sz并不是数组的元素个数

//void Print(int* p, int sz)//本质上数组传参本质上传递的是数组⾸元素的地址 故函数变量直接写指针就可以
////void Print(int p[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", p[i]);
//		//printf("%d ", *(p + i));
//	}
//}
//
//int main()
//{
//	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	Print(arr, sz);
//}

//总结：⼀维数组传参，形参的部分可以写成数组的形式，也可以写成指针的形式。

//冒泡排序(降序)

//void bubble_sort(int arr[],int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz-1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < sz - i - 1; j++)
//		{
//			//if (arr[j] < arr[j + 1]);//!!!!err
//			if (arr[j] < arr[j + 1])
//			{
//				int a = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = a;
//			}
//		}
//	}
//}
//
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//int main()
//{
//	int arr[] = { 2,4,6,3,7,9,8,1,0,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	bubble_sort(arr, sz);
//	print(arr, sz);
//
//	return 0;
//}

//优化
//void bubble_sort(int arr[],int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz-1; i++)
//	{
//		int b = 0;//假设这一趟有序
//		int j = 0;
//		for (j = 0; j < sz - i - 1; j++)
//		{
//			//if (arr[j] < arr[j + 1]);//!!!!err
//			if (arr[j] < arr[j + 1])
//			{
//				b = 1;//无序则变为零
//				int a = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = a;
//			}
//		}
//		if (b == 0)//后续趟数不用再进行
//			break;
//	}
//}
//
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//int main()
//{
//	int arr[] = { 2,4,6,3,7,9,8,1,0,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	bubble_sort(arr, sz);
//	print(arr, sz);
//
//	return 0;
//}

//指针数组模拟⼆维数组

//int main()
//{
//	int arr1[] = { 0,1,2,3,4 };
//	int arr2[] = { 1,2,3,4,5 };
//	int arr3[] = { 2,3,4,5,6 };
//
//	int* arr[] = { arr1,arr2,arr3 };//指针数组
//
//	int i = 0;
//	//for (i = 0; i < 3; i++)
//	//{
//	//	printf("%p\n", arr[i]);//打印为三个数组的首元素地址
//	//}
//
//	//for (i = 0; i < 5; i++)
//	//{
//	//	printf("%d\n", arr1[i]);//打印为arr1数组的所有元素
//	//}
//
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//注：仅仅形式上与二维数组相似，实际上不是二维数组；二维数组是一个数组，其内存是连续的


//字符指针变量
//int main()
//{
//
//	char arr[] = "abcdef";//字符数组   数组的内容可变
//	char* p1 = arr;
//	*p1 = 'w';
//
//	const char* p2 = "abcdef";//常量字符串 不是字符数组 但是内存也是连续存放的  字符串的内容不可变
//	//不是把字符串赋给p
//	//*p2 = 'w';//不可修改 故应该在定义时在*前加上const 限制*p2不可修改即p2指向的内容（字符串）不可修改
//	
//	printf("%s\n", p1);//打印的时字符数组
//	printf("%s\n", p2);//打印的时常量字符串
//	//%s 打印字符串的时候，需要提供起始地址
//
//	//两种方式p都是首字母的地址
//	return 0;
//}

//例题

//int main()
//{
//    char str1[] = "hello bit.";
//    char str2[] = "hello bit.";
//
//    const char* str3 = "hello bit.";
//    const char* str4 = "hello bit.";
//
//    if (str1 == str2)
//        printf("str1 and str2 are same\n");
//    else
//        printf("str1 and str2 are not same\n");
//    //两数组的内存空间各自独立，不同   两首元素地址不同
//
//    if (str3 == str4)
//        printf("str3 and str4 are same\n");
//    else
//        printf("str3 and str4 are not same\n");
//    //相同的常量字符串在内存空间中只有一份，因为常量字符串不能修改。所以大家共用一个空间的常量字符串就可以
//
//    return 0;
//}